package br.com.financas.controle;

import br.com.financas.beans.Categoria;
import br.com.financas.beans.Conta;
import br.com.financas.beans.Movimentacao;
import br.com.financas.beans.Pessoa;
import br.com.financas.beans.TipoConta;
import br.com.financas.beans.TipoMovimentacao;
import br.com.financas.daos.ContaDao;
import br.com.financas.daos.MovimentacaoDao;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;

/**
 * @author Denis
 */
@ManagedBean
@RequestScoped
public class MovimentacaoMB {
    
    private Movimentacao movimentacao = new Movimentacao();
    private Movimentacao movimentacaoEdit = new Movimentacao();
    private MovimentacaoDao movimentacaoDao = new MovimentacaoDao();
    private Conta conta = new Conta();
    private Conta c = new Conta();
    private TipoConta tipo = new TipoConta();
    private ContaDao contaDao = new ContaDao();
    private Categoria categoria = new Categoria();
    private TipoMovimentacao tipoMovimentacao = new TipoMovimentacao();
    private String idCategoria;
    private String idConta;
    private String idTipoMovimentacao;
    private String dataMovimentacao;
    List<Movimentacao> listarMovimentacao;
    List<Movimentacao> listarMovimentacaoR;
    List<Movimentacao> listarMovimentacaoRelatorios;
    List<Conta> contas;
    BigDecimal saldoConta;
    BigDecimal saldoNovo;
    int tipoM,t;
    private String dataEdit;
    
    public MovimentacaoMB() {
    }
    Pessoa p = (Pessoa) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"); //capturando o id do usuario logado
    
    public void adicionarMovimentacao( AjaxBehaviorEvent event) throws IOException, ParseException{
       SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");  
       java.sql.Date data = new java.sql.Date(format.parse(dataMovimentacao).getTime());
        
       movimentacao.setDataM(data);
       conta.setIdConta(Integer.parseInt(idConta));
       categoria.setIdCategoria(Integer.parseInt(idCategoria));
       tipoMovimentacao.setIdTipoMovimentacao(Integer.parseInt(idTipoMovimentacao));
       
       movimentacaoDao.addMovimentacao(movimentacao, conta, tipoMovimentacao, p, categoria);
       
       contas=contaDao.buscarSaldo(p,conta);
        for (Conta c : contas) {
            saldoConta = c.getSaldo();
            conta.setNome(c.getNome());
            t = c.getIdTipoConta().getIdTipoConta();
        }
        
        tipoM=Integer.parseInt(idTipoMovimentacao);        
        tipo.setIdTipoConta(t);
        
        if(tipoM == 1){
            saldoNovo = saldoConta.add(movimentacao.getValor());
        }else{
            saldoNovo = saldoConta.subtract(movimentacao.getValor());
        }
       conta.setSaldo(saldoNovo);
       contaDao.updateSaldoConta(conta,p,tipo);
       FacesContext.getCurrentInstance().getExternalContext().redirect("movimentacoes.xhtml");
    }
    
    public void editarMovimentacao(Movimentacao movimentacao){
        this.movimentacaoEdit = movimentacao;
        dataEdit = movimentacaoEdit.getDataM().toString();
    }
    
    public void atualizarMovimentacao(AjaxBehaviorEvent event) throws IOException, ParseException {
        
      SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");  
      java.sql.Date data = new java.sql.Date(format.parse(dataEdit).getTime());
       
       System.out.println("to aqui");
       movimentacao.setDataM(data);
       conta.setIdConta(Integer.parseInt(idConta));
       categoria.setIdCategoria(Integer.parseInt(idCategoria));
       tipoMovimentacao.setIdTipoMovimentacao(Integer.parseInt(idTipoMovimentacao));
       
       movimentacaoDao.updateMovimentacao(movimentacaoEdit,conta,categoria,tipoMovimentacao);
       FacesContext.getCurrentInstance().getExternalContext().redirect("movimentacoes.xhtml"); 
    }
    
    public void deletarMovimentacao(Movimentacao movimentacao) {
        movimentacaoDao.deletarMovimentacao(movimentacao);
    }
    
    public List listarMovimentacao() {
        listarMovimentacao = movimentacaoDao.listar(p);
        return this.listarMovimentacao;
    }
    public Conta getConta() {
        return conta;
    }

    public void setConta(Conta conta) {
        this.conta = conta;
    }

    public Categoria getCategoria() {
        return categoria;
    }

    public void setCategoria(Categoria categoria) {
        this.categoria = categoria;
    }

    public TipoMovimentacao getTipoMovimentacao() {
        return tipoMovimentacao;
    }

    public void setTipoMovimentacao(TipoMovimentacao tipoMovimentacao) {
        this.tipoMovimentacao = tipoMovimentacao;
    }

    public String getIdCategoria() {
        return idCategoria;
    }

    public void setIdCategoria(String idCategoria) {
        this.idCategoria = idCategoria;
    }

    public String getIdConta() {
        return idConta;
    }

    public void setIdConta(String idConta) {
        this.idConta = idConta;
    }

    public String getIdTipoMovimentacao() {
        return idTipoMovimentacao;
    }

    public void setIdTipoMovimentacao(String idTipoMovimentacao) {
        this.idTipoMovimentacao = idTipoMovimentacao;
    }

    public Movimentacao getMovimentacao() {
        return movimentacao;
    }

    public void setMovimentacao(Movimentacao movimentacao) {
        this.movimentacao = movimentacao;
    }

    public Movimentacao getMovimentacaoEdit() {
        return movimentacaoEdit;
    }

    public void setMovimentacaoEdit(Movimentacao movimentacaoEdit) {
        this.movimentacaoEdit = movimentacaoEdit;
    }

    public String getDataMovimentacao() {
        return dataMovimentacao;
    }

    public void setDataMovimentacao(String dataMovimentacao) {
        this.dataMovimentacao = dataMovimentacao;
    }

    public Conta getC() {
        return c;
    }

    public void setC(Conta c) {
        this.c = c;
    }

    public TipoConta getTipo() {
        return tipo;
    }

    public void setTipo(TipoConta tipo) {
        this.tipo = tipo;
    }

    public String getDataEdit() {
        return dataEdit;
    }

    public void setDataEdit(String dataEdit) {
        this.dataEdit = dataEdit;
    }
}
